#include <iostream>
#include <vector>
#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <functional>
#include "task.h"

typedef std::function<void()> task_t;

void LoadTask(std::vector<task_t> &tasks)
{
    tasks.push_back(PrintLog);
    tasks.push_back(Download);
    tasks.push_back(Backup);
}

int main()
{
    std::vector<task_t> tasks;
    LoadTask(tasks);

    pid_t id = fork();
    if(id == 0)
    {
        // child
        while(true)
        {
            printf("我是子进程，pid：%d\n",getpid());
            sleep(1);
        }
        exit(0);
    }
    //father
    while(true)
    {
        sleep(1);
        pid_t rid = waitpid(id, nullptr, WNOHANG);// 非阻塞等待
        if(rid > 0)
        {
            printf("等待子进程%d成功\n",rid);
            break;
        }
        else if(rid < 0)
        {
            printf("等待子进程%d失败\n",rid);
            break;
        }
        else 
        {
            printf("子进程尚未退出\n");
           
            //做自己的事情（非阻塞轮询）
           for(auto &task : tasks)
           {
                task();
           }
        }
    }

    return 0;
}





//enum 
//{
//    OK = 0,
//    OPEN_FILE_ERROR = 1,
//};
//
//const std::string gsep = " ";
//std::vector<int> data;
//
//int SaveBegin()
//{
//    std::string name = std::to_string(time(nullptr));
//    name += ".backup";
//    FILE *fp = fopen(name.c_str(),"w");
//    if(fp == nullptr) return OPEN_FILE_ERROR;
//
//    std::string dataStr;
//    for(auto d : data)
//    {
//        dataStr += std::to_string(d);
//        dataStr += gsep;
//    }
//
//    fputs(dataStr.c_str(), fp);
//    fclose(fp);
//    return OK;
//}
//
//void save()
//{
//    pid_t id = fork();
//    if(id == 0)// 子进程完成特定的任务
//    {
//        int code = SaveBegin();
//        exit(code);
//    }
//    // 父进程可以获得子进程的退出信息
//    int status = 0;
//    pid_t rid = waitpid(id, &status,0);
//    if(rid > 0)
//    {
//        int code = WEXITSTATUS(status);// 获得子进程的退出码
//        if(code == 0) printf("备份成功, exit code: %d\n",code);
//        else printf("备份失败, exit code: %d\n",code);
//    }
//    else 
//    {
//        perror("waitpid");
//    }
//}
//
//int main()
//{
//    int cnt = 1;
//    while(true)
//    {
//        data.push_back(cnt++);
//        sleep(1);
//
//        if(cnt % 10 == 0)
//        {
//            save();
//        }
//    }
//    // 每隔10s,备份一次数据
//    
//}
//





//#include <iostream>
//#include <string>
//#include <cstdio>
//#include <string.h>
//#include <errno.h>
//#include <cstdlib>
//#include <unistd.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//
//int main()
//{
//    pid_t id = fork();
//    if(id < 0 )
//    {
//        printf("errno: %d, errstring: %s\n",errno, strerror(errno));
//        return errno;
//    }
//    else if(id == 0)
//    {
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("子进程运行中, pid: %d\n", getpid());
//            cnt--;
//            sleep(1);
//        }
//        exit(123);
//    }
//    else 
//    {
//        int status = 0;
//        pid_t rid = waitpid(id, &status, 0); 
//        if(rid > 0)
//        {
//            if(WIFEXITED(status))// 若为正常终止子进程返回的状态，则为真。（查看进程是否正常退出）
//            {
//                printf("wait sub process success, rid: %d, status code: %d\n", rid, WEXITSTATUS(status));
//            }
//            else 
//            {
//                printf("child process quit error!\n");
//            }
//        }
//        else 
//        {
//            perror("waitpid");
//        }
//        while(true)
//        {
//            printf("我是父进程：pid: %d\n",getpid());
//            sleep(1);
//        }
//    }
//
//    return 0;
//}
